"""
数据管理API路由
"""
import os
from flask import request, jsonify, current_app, send_file
from werkzeug.utils import secure_filename
from . import bp
from ...models.dataset import Dataset
from ... import db
from .utils import allowed_file, process_file, generate_unique_filename

@bp.route('/upload', methods=['POST'])
def upload_file():
    """
    上传数据文件
    
    请求体: multipart/form-data
    - file: 数据文件（CSV或Excel）
    - description: 可选的数据集描述
    - preview_rows: 可选，预览行数（默认10行）
    
    返回:
    - 成功: {
        "success": true, 
        "data": {
            ...dataset_info,
            "rows": [...],     # 数据行内容
            "columns": [...]   # 列名列表
        }
    }
    - 失败: {"success": false, "message": error_message}
    """
    if 'file' not in request.files:
        return jsonify({
            'success': False,
            'message': '没有上传文件'
        }), 400
        
    file = request.files['file']
    if file.filename == '':
        return jsonify({
            'success': False,
            'message': '没有选择文件'
        }), 400
        
    if not allowed_file(file.filename):
        return jsonify({
            'success': False,
            'message': '不支持的文件类型'
        }), 400
    
    try:
        # 生成安全的原始文件名
        original_filename = secure_filename(file.filename)
        # 生成唯一的存储文件名
        storage_filename = generate_unique_filename(original_filename)
        file_path = os.path.join(current_app.config['UPLOAD_FOLDER'], storage_filename)
        file.save(file_path)
        
        # 处理文件并创建数据集记录
        dataset = Dataset(
            filename=storage_filename,        # 存储的文件名
            original_filename=original_filename,  # 原始文件名
            file_path=file_path,             # 保存实际的存储路径
            file_type=original_filename.rsplit('.', 1)[1].lower(),
            description=request.form.get('description', '')
        )
        
        # 读取并处理文件，获取元数据
        row_count, column_info = process_file(file_path)
        dataset.update_metadata(row_count, column_info)
        
        # 获取预览数据
        preview_rows = request.form.get('preview_rows', 10, type=int)
        preview_data = process_file(file_path, preview_rows=preview_rows)
        
        # 保存到数据库
        db.session.add(dataset)
        db.session.commit()

        # 用dataset.id重命名文件，统一为<dataset_id>.csv
        new_filename = f"{dataset.id}.csv"
        new_file_path = os.path.join(current_app.config['UPLOAD_FOLDER'], new_filename)
        os.rename(file_path, new_file_path)
        dataset.filename = new_filename
        dataset.file_path = new_file_path
        db.session.commit()

        # 构建响应数据
        response_data = dataset.to_dict()
        response_data['rows'] = preview_data['data']      # 数据行
        response_data['columns'] = preview_data['columns'] # 列名列表
        
        return jsonify({
            'success': True,
            'data': response_data
        })
        
    except Exception as e:
        # 如果出错，删除已上传的文件
        if os.path.exists(file_path):
            os.remove(file_path)
        return jsonify({
            'success': False,
            'message': f'处理文件时出错: {str(e)}'
        }), 500

@bp.route('/list', methods=['GET'])
def list_datasets():
    """
    获取数据集列表
    
    查询参数:
    - page: 页码（默认1）
    - per_page: 每页数量（默认10）
    
    返回:
    {
        "total": 总数据集数量,
        "pages": 总页数,
        "current_page": 当前页码,
        "data": [数据集列表]
    }
    """
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    
    pagination = Dataset.query.order_by(Dataset.created_at.desc()).paginate(
        page=page, per_page=per_page, error_out=False)
    
    return jsonify({
        'total': pagination.total,
        'pages': pagination.pages,
        'current_page': page,
        'data': [item.to_dict() for item in pagination.items]
    })

@bp.route('/<int:dataset_id>', methods=['GET'])
def get_dataset(dataset_id):
    """获取数据集详情"""
    dataset = Dataset.query.get_or_404(dataset_id)
    return jsonify(dataset.to_dict())

@bp.route('/<int:dataset_id>/preview', methods=['GET'])
def preview_dataset(dataset_id):
    """
    预览数据集内容
    
    查询参数:
    - rows: 预览行数（默认10）
    """
    dataset = Dataset.query.get_or_404(dataset_id)
    rows = request.args.get('rows', 10, type=int)
    
    try:
        preview_data = process_file(dataset.file_path, preview_rows=rows)
        return jsonify({
            'success': True,
            'data': preview_data
        })
    except Exception as e:
        return jsonify({
            'success': False,
            'message': f'预览数据时出错: {str(e)}'
        }), 500

@bp.route('/<int:dataset_id>/export', methods=['GET'])
def export_dataset(dataset_id):
    """导出数据集"""
    dataset = Dataset.query.get_or_404(dataset_id)
    
    if not os.path.exists(dataset.file_path):
        return jsonify({
            'success': False,
            'message': '文件不存在'
        }), 404
        
    return send_file(
        dataset.file_path,
        as_attachment=True,
        download_name=dataset.filename,
        mimetype='application/octet-stream'  # 使用通用的二进制流类型
    )

@bp.route('/<int:dataset_id>', methods=['DELETE'])
def delete_dataset(dataset_id):
    """
    删除数据集
    
    Args:
        dataset_id: 数据集ID
    
    Returns:
        - 成功: {"success": true, "message": "数据集删除成功"}
        - 失败: {"success": false, "message": error_message}
    """
    try:
        dataset = Dataset.query.get_or_404(dataset_id)
        
        # 删除文件
        if os.path.exists(dataset.file_path):
            os.remove(dataset.file_path)
            
        # 删除数据库记录
        db.session.delete(dataset)
        db.session.commit()
        
        return jsonify({
            'success': True,
            'message': '数据集删除成功'
        })
        
    except Exception as e:
        return jsonify({
            'success': False,
            'message': f'删除数据集时出错: {str(e)}'
        }), 500 